import { Response } from 'express';

/**
 * 分页信息接口
 */
interface PaginationInfo {
  page: number;
  limit: number;
  total: number;
  totalPages: number;
}

/**
 * 统一响应格式工具类
 */
export class ResponseHelper {
  /**
   * 成功响应
   * @param res Express响应对象
   * @param data 响应数据
   * @param message 响应消息
   * @param code HTTP状态码
   */
  static success<T = any>(res: Response, data: T = null as any, message: string = '操作成功', code: number = 200): Response {
    return res.status(code).json({
      success: true,
      message,
      data,
      timestamp: new Date().toISOString()
    });
  }

  /**
   * 错误响应
   * @param res Express响应对象
   * @param message 错误消息
   * @param code HTTP状态码
   * @param error 错误详情（开发环境使用）
   */
  static error(res: Response, message: string = '操作失败', code: number = 400, error: any = null): Response {
    const response: any = {
      success: false,
      message,
      timestamp: new Date().toISOString()
    };

    // 开发环境返回错误详情
    if (process.env.NODE_ENV === 'development' && error) {
      response.error = error;
    }

    return res.status(code).json(response);
  }

  /**
   * 分页响应
   * @param res Express响应对象
   * @param data 数据列表
   * @param pagination 分页信息
   * @param message 响应消息
   */
  static paginated<T = any>(res: Response, data: T[], pagination: PaginationInfo, message: string = '获取成功'): Response {
    return res.status(200).json({
      success: true,
      message,
      data,
      pagination,
      timestamp: new Date().toISOString()
    });
  }

  /**
   * 验证错误响应
   * @param res Express响应对象
   * @param errors 验证错误信息
   */
  static validationError(res: Response, errors: any[] | object): Response {
    return res.status(422).json({
      success: false,
      message: '数据验证失败',
      errors,
      timestamp: new Date().toISOString()
    });
  }

  /**
   * 未授权响应
   * @param res Express响应对象
   * @param message 错误消息
   */
  static unauthorized(res: Response, message: string = '未授权访问'): Response {
    return res.status(401).json({
      success: false,
      message,
      timestamp: new Date().toISOString()
    });
  }

  /**
   * 禁止访问响应
   * @param res Express响应对象
   * @param message 错误消息
   */
  static forbidden(res: Response, message: string = '禁止访问'): Response {
    return res.status(403).json({
      success: false,
      message,
      timestamp: new Date().toISOString()
    });
  }

  /**
   * 资源未找到响应
   * @param res Express响应对象
   * @param message 错误消息
   */
  static notFound(res: Response, message: string = '资源未找到'): Response {
    return res.status(404).json({
      success: false,
      message,
      timestamp: new Date().toISOString()
    });
  }

  /**
   * 服务器内部错误响应
   * @param res Express响应对象
   * @param message 错误消息
   * @param error 错误详情
   */
  static serverError(res: Response, message: string = '服务器内部错误', error: any = null): Response {
    console.error('服务器错误:', error);
    
    const response: any = {
      success: false,
      message,
      timestamp: new Date().toISOString()
    };

    // 开发环境返回错误详情
    if (process.env.NODE_ENV === 'development' && error) {
      response.error = error.message || error;
      response.stack = error.stack;
    }

    return res.status(500).json(response);
  }
}

export default ResponseHelper;